// leetcode 997 找到小镇的法官,c++20
// Created by 吴成文 on 2021/12/19.
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    // 思路：
    // 首先我们创建大小为n的vector,来记录当前人员是否是法官。以及信任他的人数
    // 最后，遍历vector,找到是法官，并且信任他的人数为n-1的那个人。如果没有，则返回-1
    int findJudge(int n, vector<vector<int>>& trust)
    {
        vector<StaticsTrust> statistics(n + 1);

        for (auto& item : trust) {
            statistics[item.at(0)].isJudge_ =
                false;  // 该人员信任了其他人，所以他不可能是法官
            statistics[item.at(1)].trustedCount_ +=
                1;  // 该人员被其他人信任了，信任数量加一
        }

        // 由于不可能有两个法官，所以只要找到了就可以直接退出
        for (auto idx = 1; idx < statistics.size(); ++idx) {
            if (statistics[idx].isJudge_ == true &&
                statistics[idx].trustedCount_ == n - 1) {
                return idx;
            }
        }
        return -1;
    }

private:
    struct StaticsTrust {
        bool isJudge_;
        uint32_t trustedCount_;
        StaticsTrust() : isJudge_(true), trustedCount_(0) {}
    };
};

int main()
{
    Solution sol;
    vector<vector<int>> trust({{1, 3}, {2, 3}, {3, 1}});
    cout << sol.findJudge(3, trust);
    return 0;
}